package com.locus.locus.client.widgets;

import java.util.ArrayList;
import java.util.List;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
import com.locus.locus.client.ServidorAsync;
import com.locus.locus.client.dados.EstabelecimentoWrapper;
import com.locus.locus.client.dados.LocalizacaoWrapper;
import com.locus.locus.client.dados.UsuarioLocusWrapper;

public class WidgetEstabelecimento extends Composite {

	public class DeletarHandler implements ClickHandler {

		private final EstabelecimentoWrapper estabelecimento;

		public DeletarHandler(EstabelecimentoWrapper estabelecimento) {
			this.estabelecimento = estabelecimento;
		}

		@Override
		public void onClick(ClickEvent event) {
			servidor.excluirExtabelecimento(estabelecimento, callbackExcluir);
		}

	}

	private static WidgetEstabelecimentoUiBinder uiBinder = GWT
			.create(WidgetEstabelecimentoUiBinder.class);
	interface WidgetEstabelecimentoUiBinder extends
			UiBinder<Widget, WidgetEstabelecimento> {
	}
	
	@UiField
	TextBox tbNome;
	@UiField
	TextBox tbNomeSite;	
	@UiField
	TextBox tbTwiiter;
	@UiField
	TextBox tbUrl;
	@UiField
	TextBox tbLatitude;
	@UiField
	TextBox tbLongitude;
	@UiField
	TextArea taInfo;
	@UiField
	Button btInserir;	
	@UiField
	Button btBuscarAdmin;	
	@UiField
	ListBox listaAdmins;
	@UiField
	FlexTable tabelaAdmins;
	@UiField
	Button btAdicionarAdmin;	
	@UiField
	FlexTable tabelaEstabelecimentos;

	private final ServidorAsync servidor;
	
	private List<UsuarioLocusWrapper> usuariosWrapper;
	private final ArrayList<UsuarioLocusWrapper> adminsSelecionados;
	
	public AsyncCallback<Void> callbackExcluir = new AsyncCallback<Void>() {
		@Override
		public void onSuccess(Void result) {
			servidor.buscarEstabelecimentos(callbackBuscarEstabelecimentos);
		}
		
		@Override
		public void onFailure(Throwable caught) {
			Window.alert("falhou em excluir");
		}
	};
	
	private final AsyncCallback<Void> callbackInserirEstabelecimento = new AsyncCallback<Void>() {
		@Override
		public void onSuccess(Void result) {
			tbNome.setText("");
			tbNomeSite.setText("");
			tbTwiiter.setText("");
			tbUrl.setText("");
			taInfo.setText("");
			tbLatitude.setText("");
			tbLongitude.setText("");
			
			btInserir.setEnabled(true);
			
			adminsSelecionados.clear();
			listaAdmins.clear();
			adminsSelecionados.clear();
			
			buscarLista();
		}
		
		@Override
		public void onFailure(Throwable caught) {
			Window.alert("falha em inserir estabelecimento");
			btInserir.setEnabled(true);
		}
	};

	private final AsyncCallback<List<EstabelecimentoWrapper>> callbackBuscarEstabelecimentos = new AsyncCallback<List<EstabelecimentoWrapper>>() {
		@Override
		public void onSuccess(List<EstabelecimentoWrapper> estabelecimentos) {
			atualizarLista(estabelecimentos);
		}
		
		@Override
		public void onFailure(Throwable caught) {
			Window.alert("falha em buscar estabelecimentos");
		}
	};
	

	private final AsyncCallback<List<UsuarioLocusWrapper>> callbackBuscarAdminSelecao = new AsyncCallback<List<UsuarioLocusWrapper>>() {
		@Override
		public void onSuccess(List<UsuarioLocusWrapper> usuarios) {
			btBuscarAdmin.setEnabled(false);
			listaAdmins.setVisible(true);
			btAdicionarAdmin.setVisible(true);
			
			usuariosWrapper = usuarios;
			
			for(UsuarioLocusWrapper usuario:usuarios){
				listaAdmins.addItem(usuario.getNome(), usuario.getChave());
			}
		}
		
		@Override
		public void onFailure(Throwable caught) {
			Window.alert("falha em buscar admins");
		}
	};

	public WidgetEstabelecimento(ServidorAsync servidor) {
		initWidget(uiBinder.createAndBindUi(this));
		this.servidor = servidor;
		this.buscarLista();

		this.adminsSelecionados = new ArrayList<UsuarioLocusWrapper>();
		
		this.tabelaEstabelecimentos.setBorderWidth(1);
		this.listaAdmins.setVisible(false);
		this.btAdicionarAdmin.setVisible(false);
		this.taInfo.setVisibleLines(6);
	}

	private void buscarLista() {
		this.servidor.buscarEstabelecimentos(this.callbackBuscarEstabelecimentos );
	}

	private void atualizarLista(List<EstabelecimentoWrapper> estabelecimentos) {
		EstabelecimentoWrapper estabelecimento;
		Button btDeletar;
		
		this.tabelaEstabelecimentos.removeAllRows();
		
		this.tabelaEstabelecimentos.setText(0, 0, "Nome do estabelecimento");
		this.tabelaEstabelecimentos.setText(0, 1, "Nome do site");
		this.tabelaEstabelecimentos.setText(0, 2, "Identificador do twiiter");
		this.tabelaEstabelecimentos.setText(0, 3, "Url do sitema");

		for(int i = 0; i < estabelecimentos.size(); i++){
			estabelecimento = estabelecimentos.get(i);
			btDeletar = new Button("Deletar");
			btDeletar.addClickHandler(new DeletarHandler(estabelecimento));
			
			this.tabelaEstabelecimentos.setText(i+1, 0, estabelecimento.getNome());
			this.tabelaEstabelecimentos.setText(i+1, 1, estabelecimento.getNomeSite());
			this.tabelaEstabelecimentos.setText(i+1, 2, estabelecimento.getIdTwitter());
			this.tabelaEstabelecimentos.setText(i+1, 3, estabelecimento.getUrlSite());
			
			this.tabelaEstabelecimentos.setWidget(i + 1, 4, btDeletar);
		}
	}

	@UiHandler("btInserir")
	void inserirEstabelecimento(ClickEvent e) {
		EstabelecimentoWrapper wrapper = new EstabelecimentoWrapper();
		
		this.btInserir.setEnabled(false);
		
		wrapper.setNome(this.tbNome.getText());
		wrapper.setNomeSite(this.tbNomeSite.getText());
		wrapper.setIdTwitter(this.tbTwiiter.getText());
		wrapper.setUrlSite(this.tbUrl.getText());
		wrapper.setInformacoes(this.taInfo.getText());
		wrapper.setAdministradores(this.adminsSelecionados);
		
		if(this.tbLatitude.getText() != null && !this.tbLatitude.getText().equals("")){
			final LocalizacaoWrapper localizacao = new LocalizacaoWrapper();
			final ArrayList<LocalizacaoWrapper> localizacoes = new ArrayList<LocalizacaoWrapper>(1);
			
			localizacao.setLatitude(Double.parseDouble(this.tbLatitude.getText()));
			localizacao.setLongitude(Double.parseDouble(this.tbLongitude.getText()));
			localizacao.setDescricao(this.tbNome.getText());
			localizacoes.add(localizacao);
			
			wrapper.setLocalizacoes(localizacoes);
		}
		
		this.servidor.inserirExtabelecimento(wrapper, this.callbackInserirEstabelecimento);
	}

	@UiHandler("btBuscarAdmin")
	void procurarAdmin(ClickEvent e){
		this.servidor.buscarUsusarios(this.callbackBuscarAdminSelecao);
	}	

	@UiHandler("btAdicionarAdmin")
	void adicionarAdmin(ClickEvent e){
		int linha = this.tabelaAdmins.getRowCount();
		int indiceSelecionado = this.listaAdmins.getSelectedIndex();
		String nome = this.listaAdmins.getItemText(indiceSelecionado);
		
		this.adminsSelecionados.add(this.usuariosWrapper.get(indiceSelecionado));		
		this.tabelaAdmins.setText(linha, 0, nome);
	}
}
